﻿#define _CRT_SECURE_NO_WARNINGS 1
给你一个链表的头节点 head ，旋转链表，将链表每个节点向右移动 k 个位置。



示例 1：


输入：head = [1, 2, 3, 4, 5], k = 2
输出：[4, 5, 1, 2, 3]
示例 2：


输入：head = [0, 1, 2], k = 4
输出：[2, 0, 1]


提示：

链表中节点的数目在范围[0, 500] 内
- 100 <= Node.val <= 100
0 <= k <= 2 * 109

来源：力扣（LeetCode）
链接：https ://leetcode-cn.com/problems/rotate-list
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* rotateRight(struct ListNode* head, int k) {
    if (head == NULL || head->next == NULL)//首先判断是否可以进行旋转
        return head;
    struct ListNode* cur = head;
    int numsSize = 0;
    while (cur)
    {
        numsSize++;
        cur = cur->next;
    }
    //由于旋转链表的过程中带有周期性，故k大于链表长度的情况下就会增加周期，
    //因此，那些周期我们应该将他们去掉：
    k = k % numsSize;//记得将k的值降下来，否则会超出时间限制
    cur = head;
    for (int i = 0; i < k; i++)//不断迭代
    {

        struct ListNode* prev = head;
        while (cur->next)//找尾
        {
            prev = cur;
            cur = cur->next;
        }
        struct ListNode* last = cur;

        last->next = head;
        head = last;
        prev->next = NULL;//别忘了将迭代之后的尾置空

    }
    return head;
}